package com.cskaoyan.javase.oop3._2inner._2static._1basic;

/**
 * 在具体讲解静态内部类的访问特点之前,先明确以下两点:
 * 1.静态内部类和外围类之间的访问不受权限限制.
 * 2.静态内部类和外围类之间是独立的关系,互相是不影响的.
 *      思考:
 *      1.它们之间创建任一对象,会持有对方的引用吗?
 *      不会
 *      2.它们之间创建任一对象,会互相影响吗?
 *      没有影响
 *      3.它们之间的类加载,会互相影响吗?
 *      也不会
 *
 * 静态内部类的访问特点，主要从以下几个角度研究：
 * 1.静态内部类内部访问外围类
 *      这时访问外围类,需要外围类对象
 *      访问的位置: 成员方法和静态方法
 *      没有外围类对象,那就创建它的对象,new对象
 *      怎么new?
 *      直接new
 *      new完了访问即可.
 *
 * 2.外围类访问静态内部类成员
 *      和上面一样,直接new创建对象访问即可.
 *
 * 3.外部类访问静态内部类成员
 *      首先这里的访问,全程都是要受权限限制的
 *      语法:
 *      EnclosedClazz.Inner i = new EnclosedClazz.Inner();
 *
 * 4.静态内部类访问外部类成员
 *      可以访问,但是受权限限制
 *      和普通类之间的互相访问没有区别
 *
 * @since 17:04
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 这里需要指出该静态内部类属于哪个外围类
        EnclosedClazz.Inner i = new EnclosedClazz.Inner();
        EnclosedClazz.Inner2 i2 = new EnclosedClazz().new Inner2();
    }
}

class EnclosedClazz {
    int a;
    private int b = 10;
    static int c = 20;
    static final int D = 30;

    public void test(){
        Inner i = new Inner();
        System.out.println(i.a);
        System.out.println(i.b);
    }
    public static void testStatic(){
        Inner i = new Inner();
        System.out.println(i.a);
        System.out.println(i.b);
    }

    class Inner2{}
    // 静态内部类
    static class Inner {
        int a;
        private int b = 10;
        static int c = 20;
        static final int D = 30;

        public void testNested() {
            EnclosedClazz ec = new EnclosedClazz();
            System.out.println(ec.a);
            System.out.println(ec.b);
            System.out.println(a);
            System.out.println(b);
        }

        public static void testStaticNested() {
            EnclosedClazz ec = new EnclosedClazz();
            System.out.println(ec.a);
            System.out.println(ec.b);

            Inner i = new Inner();
            System.out.println(i.a);
            System.out.println(i.b);
        }
    }
}